#ifndef DOMPARSER_H
#define DOMPARSER_H


#include <QDomNamedNodeMap>
#include <QDomDocument>
#include <QStringList>
#include <QFile>
#include <QMutex>


#ifndef D_COMPONENT_VERSION_FILE
#define D_COMPONENT_VERSION_FILE "/tcrwork/linuxController/trunk/TcrController/data/globalConfig/version/version.xml"
#endif

/**
 * @brief pthreadMutex ///线程锁
 */
extern pthread_mutex_t pthreadMutex;
/**
 * @brief cond ///线程同步信号
 */
extern pthread_cond_t cond;
/**
 * @brief attr ///线程锁参数
 */
extern pthread_mutexattr_t attr;

/**
 * @brief The DomParser class  xml文件读写封装
 * change:
 * 2017-1-4-xyf ,版本1.0.2 ，新增接口：往版本信息xml 写入版本变更内容
 *2017-1-11-xyf ,版本1.0.3 ，修改版本号读写接口，加锁，防止多线程同时操作。
 * 2017-1-14-xyf, 版本1.0.4, //极少几率出现打开后无法 setContent的问题，添加打开等待1ms；
 * 2017-2-20-xyf, 版本1.0.5, 修正 #x001A 格式数据不支持问题   readXml( QDomNode node ,unsigned int &val ) 接口漏写.remove("#x")
 */
#ifdef DOMPARSER_LIBRARY
#include "domparser_global.h"
class  DOMPARSERSHARED_EXPORT  DomParser
#else
class  DomParser
#endif
{
public:
      DomParser();
      ~DomParser();

      /**
       * @brief openXml 打开文件
       * @param FilePath 路径+文件名
       * @param mode 打开模式
       * @return ok= true
       */
      bool openXml(QString FilePath, QFile::OpenMode mode);
      void closeXml(bool save=false);


      /**
       * @brief addNode 往某节点添加一个子元素
       * @param pnode   某节点
       * @param nodeName  子元素
       * @param text   子元素de值
       * @return   子元素
       */
      QDomElement addNode(QDomNode &pnode, QString nodeName, QString val="");
      QDomElement addNode(QDomNode &pnode, QString nodeName, int val);
      QDomElement addNode(QDomNode &pnode, QString nodeName, unsigned int val);

      /**
       * @brief readXml 获取节点数据
       * @param node
       * @param val
       * @return , true if ok
       */
      bool readXml( QDomNode node ,char &val );
      bool readXml( QDomNode node ,unsigned char &val );
      bool readXml( QDomNode node, int &val );
      bool readXml( QDomNode node ,unsigned int &val );
      bool readXml( QDomNode node, float &val );
      bool readXml( QDomNode node, double &val );
      bool readXml( QDomNode node, QString &val );

      /**
       * @brief writeXml 写入节点数据
       * @param node
       * @param val
       */
      void writeXml( QDomNode node, unsigned char &val );
      void writeXml( QDomNode node, char &val );
      void writeXml( QDomNode node, unsigned int &val );
      void writeXml( QDomNode node, int &val );
      void writeXml( QDomNode node, double &val );
      void writeXml( QDomNode node, QString val );
      /**********************************
       * 日期：2017-3-7
       *  添加人：ｓｔｅｖｅｎ
       * 添加内容：写入ｘｍｌ文件相关的节点属性和值
       * ********************************/
      /**
       * @brief writeXml
       * @param rootNode
       * @param nodeName
       * @param nodeValue
       * @param nodeAttr1
       * @param nodeValue1
       * @param nodeAttr2
       * @param nodeValue2
       * @param nodeAttr3
       * @param nodeValue3
       */
      void writeXml(QString rootNode,QString nodeName,QString nodeValue,QString nodeAttr1 = "",QString nodeValue1 = "",
                    QString nodeAttr2="",QString nodeValue2 = "",QString nodeAttr3 = "",QString nodeValue3 = "");

      /**
       * @brief findSubNode 查找节点的子节点
       * @param node
       * @param name
       * @return
       */
      QDomNode findSubNode(const QDomNode &node, QString name, bool &ok );

      /**
       * @brief findSibNode,  //在当前给的list中查找节点
       * @param node
       * @param name
       * @param ok
       * @return
       */
      QDomNode findSibNode(const QDomNodeList &nodelist, QString name , bool&ok);

      /**
       * @brief findNode, 在树中查找节点
       * @param nodeTree ,nodeTree ={ 二级节点名,  三级节点名, 四级节点名 ... ... }
       * @param ok, true if ok
       * @return, 节点
       */
      QDomNode findNode( const QStringList &nodeTree, bool &ok );

      /**
       * @brief setComponentVersion 写组件版本号
       * @param className 组件名
       * @param date 发布日期
       * @param version 版本号 ，统一从 1.0.0 开始
       */
      void setComponentVersion(QString className, QString date, QString version );

      /**
       * @brief setComponentVersion
       * @param className
       * @param date
       * @param version
       * @param log
       */
      void setComponentVersion(QString className, QString date, QString version, QString log );

protected:
      /**
       * @brief m_file 当前打开文件指针
       */
      QFile *m_file;
      /**
       * @brief m_filePath  记录当前打开文件
 ‘*/
      QString m_filePath;

      /**
       * @brief m_doc //主节点
       */
      QDomDocument m_doc; //主节点
      QDomElement m_root; //主节点

public:
//      /**
//       * @brief md5Instance     md5检测对象
//       */
//      MD5Check *md5Instance;
};

#endif // DOMPARSER_H
